export default {
  title: "A JSON Schema for Swagger 2.0 API.",
  id: "http://swagger.io/v2/schema.json#",
  $schema: "http://json-schema.org/draft-04/schema#",
  type: "object",
  required: ["swagger", "info", "paths"],
  additionalProperties: false,
  patternProperties: {
    "^x-": {
      $ref: "#/definitions/vendorExtension"
    }
  },
  properties: {
    swagger: {
      type: "string",
      enum: ["2.0"],
      description: "The Swagger version of this document."
    },
    info: {
      $ref: "#/definitions/info"
    },
    host: {
      type: "string",
      pattern: "^[^{}/ :\\\\]+(?::\\d+)?$",
      description: "The host (name or ip) of the API. Example: 'swagger.io'"
    },
    basePath: {
      type: "string",
      pattern: "^/",
      description: "The base path to the API. Example: '/api'."
    },
    schemes: {
      $ref: "#/definitions/schemesList"
    },
    consumes: {
      description: "A list of MIME types accepted by the API.",
      allOf: [
        {
          $ref: "#/definitions/mediaTypeList"
        }
      ]
    },
    produces: {
      description: "A list of MIME types the API can produce.",
      allOf: [
        {
          $ref: "#/definitions/mediaTypeList"
        }
      ]
    },
    paths: {
      $ref: "#/definitions/paths"
    },
    definitions: {
      $ref: "#/definitions/definitions"
    },
    parameters: {
      $ref: "#/definitions/parameterDefinitions"
    },
    responses: {
      $ref: "#/definitions/responseDefinitions"
    },
    security: {
      $ref: "#/definitions/security"
    },
    securityDefinitions: {
      $ref: "#/definitions/securityDefinitions"
    },
    tags: {
      type: "array",
      items: {
        $ref: "#/definitions/tag"
      },
      uniqueItems: true
    },
    externalDocs: {
      $ref: "#/definitions/externalDocs"
    }
  },
  definitions: {
    info: {
      type: "object",
      description: "General information about the API.",
      required: ["version", "title"],
      additionalProperties: false,
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      },
      properties: {
        title: {
          type: "string",
          description: "A unique and precise title of the API."
        },
        version: {
          type: "string",
          description: "A semantic version number of the API."
        },
        description: {
          type: "string",
          description:
            "A longer description of the API. Should be different from the title.  GitHub Flavored Markdown is allowed."
        },
        termsOfService: {
          type: "string",
          description: "The terms of service for the API."
        },
        contact: {
          $ref: "#/definitions/contact"
        },
        license: {
          $ref: "#/definitions/license"
        }
      }
    },
    contact: {
      type: "object",
      description: "Contact information for the owners of the API.",
      additionalProperties: false,
      properties: {
        name: {
          type: "string",
          description:
            "The identifying name of the contact person/organization."
        },
        url: {
          type: "string",
          description: "The URL pointing to the contact information.",
          format: "uri"
        },
        email: {
          type: "string",
          description: "The email address of the contact person/organization.",
          format: "email"
        }
      },
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    license: {
      type: "object",
      required: ["name"],
      additionalProperties: false,
      properties: {
        name: {
          type: "string",
          description:
            "The name of the license type. It's encouraged to use an OSI compatible license."
        },
        url: {
          type: "string",
          description: "The URL pointing to the license.",
          format: "uri"
        }
      },
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    paths: {
      type: "object",
      description:
        "Relative paths to the individual endpoints. They must be relative to the 'basePath'.",
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        },
        "^/": {
          $ref: "#/definitions/pathItem"
        }
      },
      additionalProperties: false
    },
    definitions: {
      type: "object",
      additionalProperties: {
        $ref: "#/definitions/schema"
      },
      description:
        "One or more JSON objects describing the schemas being consumed and produced by the API."
    },
    parameterDefinitions: {
      type: "object",
      additionalProperties: {
        $ref: "#/definitions/parameter"
      },
      description: "One or more JSON representations for parameters"
    },
    responseDefinitions: {
      type: "object",
      additionalProperties: {
        $ref: "#/definitions/response"
      },
      description: "One or more JSON representations for parameters"
    },
    externalDocs: {
      type: "object",
      additionalProperties: false,
      description: "information about external documentation",
      required: ["url"],
      properties: {
        description: {
          type: "string"
        },
        url: {
          type: "string",
          format: "uri"
        }
      },
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    examples: {
      type: "object",
      additionalProperties: true
    },
    mimeType: {
      type: "string",
      description: "The MIME type of the HTTP message."
    },
    operation: {
      type: "object",
      required: ["responses"],
      additionalProperties: false,
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      },
      properties: {
        tags: {
          type: "array",
          items: {
            type: "string"
          },
          uniqueItems: true
        },
        summary: {
          type: "string",
          description: "A brief summary of the operation."
        },
        description: {
          type: "string",
          description:
            "A longer description of the operation, GitHub Flavored Markdown is allowed."
        },
        externalDocs: {
          $ref: "#/definitions/externalDocs"
        },
        operationId: {
          type: "string",
          description: "A unique identifier of the operation."
        },
        produces: {
          description: "A list of MIME types the API can produce.",
          allOf: [
            {
              $ref: "#/definitions/mediaTypeList"
            }
          ]
        },
        consumes: {
          description: "A list of MIME types the API can consume.",
          allOf: [
            {
              $ref: "#/definitions/mediaTypeList"
            }
          ]
        },
        parameters: {
          $ref: "#/definitions/parametersList"
        },
        responses: {
          $ref: "#/definitions/responses"
        },
        schemes: {
          $ref: "#/definitions/schemesList"
        },
        deprecated: {
          type: "boolean",
          default: false
        },
        security: {
          $ref: "#/definitions/security"
        }
      }
    },
    pathItem: {
      type: "object",
      additionalProperties: false,
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      },
      properties: {
        $ref: {
          type: "string"
        },
        get: {
          $ref: "#/definitions/operation"
        },
        put: {
          $ref: "#/definitions/operation"
        },
        post: {
          $ref: "#/definitions/operation"
        },
        delete: {
          $ref: "#/definitions/operation"
        },
        options: {
          $ref: "#/definitions/operation"
        },
        head: {
          $ref: "#/definitions/operation"
        },
        patch: {
          $ref: "#/definitions/operation"
        },
        parameters: {
          $ref: "#/definitions/parametersList"
        }
      }
    },
    responses: {
      type: "object",
      description:
        "Response objects names can either be any valid HTTP status code or 'default'.",
      minProperties: 1,
      additionalProperties: false,
      patternProperties: {
        "^([0-9]{3})$|^(default)$": {
          $ref: "#/definitions/responseValue"
        },
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      },
      not: {
        type: "object",
        additionalProperties: false,
        patternProperties: {
          "^x-": {
            $ref: "#/definitions/vendorExtension"
          }
        }
      }
    },
    responseValue: {
      oneOf: [
        {
          $ref: "#/definitions/response"
        },
        {
          $ref: "#/definitions/jsonReference"
        }
      ]
    },
    response: {
      type: "object",
      required: ["description"],
      properties: {
        description: {
          type: "string"
        },
        schema: {
          oneOf: [
            {
              $ref: "#/definitions/schema"
            },
            {
              $ref: "#/definitions/fileSchema"
            }
          ]
        },
        headers: {
          $ref: "#/definitions/headers"
        },
        examples: {
          $ref: "#/definitions/examples"
        }
      },
      additionalProperties: false,
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    headers: {
      type: "object",
      additionalProperties: {
        $ref: "#/definitions/header"
      }
    },
    header: {
      type: "object",
      additionalProperties: false,
      required: ["type"],
      properties: {
        type: {
          type: "string",
          enum: ["string", "number", "integer", "boolean", "array"]
        },
        format: {
          type: "string"
        },
        items: {
          $ref: "#/definitions/primitivesItems"
        },
        collectionFormat: {
          $ref: "#/definitions/collectionFormat"
        },
        default: {
          $ref: "#/definitions/default"
        },
        maximum: {
          $ref: "#/definitions/maximum"
        },
        exclusiveMaximum: {
          $ref: "#/definitions/exclusiveMaximum"
        },
        minimum: {
          $ref: "#/definitions/minimum"
        },
        exclusiveMinimum: {
          $ref: "#/definitions/exclusiveMinimum"
        },
        maxLength: {
          $ref: "#/definitions/maxLength"
        },
        minLength: {
          $ref: "#/definitions/minLength"
        },
        pattern: {
          $ref: "#/definitions/pattern"
        },
        maxItems: {
          $ref: "#/definitions/maxItems"
        },
        minItems: {
          $ref: "#/definitions/minItems"
        },
        uniqueItems: {
          $ref: "#/definitions/uniqueItems"
        },
        enum: {
          $ref: "#/definitions/enum"
        },
        multipleOf: {
          $ref: "#/definitions/multipleOf"
        },
        description: {
          type: "string"
        }
      },
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    vendorExtension: {
      description: "Any property starting with x- is valid.",
      additionalProperties: true,
      additionalItems: true
    },
    bodyParameter: {
      type: "object",
      required: ["name", "in", "schema"],
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      },
      properties: {
        description: {
          type: "string",
          description:
            "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
        },
        name: {
          type: "string",
          description: "The name of the parameter."
        },
        in: {
          type: "string",
          description: "Determines the location of the parameter.",
          enum: ["body"]
        },
        required: {
          type: "boolean",
          description:
            "Determines whether or not this parameter is required or optional.",
          default: false
        },
        schema: {
          $ref: "#/definitions/schema"
        }
      },
      additionalProperties: false
    },
    headerParameterSubSchema: {
      additionalProperties: false,
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      },
      properties: {
        required: {
          type: "boolean",
          description:
            "Determines whether or not this parameter is required or optional.",
          default: false
        },
        in: {
          type: "string",
          description: "Determines the location of the parameter.",
          enum: ["header"]
        },
        description: {
          type: "string",
          description:
            "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
        },
        name: {
          type: "string",
          description: "The name of the parameter."
        },
        type: {
          type: "string",
          enum: ["string", "number", "boolean", "integer", "array"]
        },
        format: {
          type: "string"
        },
        items: {
          $ref: "#/definitions/primitivesItems"
        },
        collectionFormat: {
          $ref: "#/definitions/collectionFormat"
        },
        default: {
          $ref: "#/definitions/default"
        },
        maximum: {
          $ref: "#/definitions/maximum"
        },
        exclusiveMaximum: {
          $ref: "#/definitions/exclusiveMaximum"
        },
        minimum: {
          $ref: "#/definitions/minimum"
        },
        exclusiveMinimum: {
          $ref: "#/definitions/exclusiveMinimum"
        },
        maxLength: {
          $ref: "#/definitions/maxLength"
        },
        minLength: {
          $ref: "#/definitions/minLength"
        },
        pattern: {
          $ref: "#/definitions/pattern"
        },
        maxItems: {
          $ref: "#/definitions/maxItems"
        },
        minItems: {
          $ref: "#/definitions/minItems"
        },
        uniqueItems: {
          $ref: "#/definitions/uniqueItems"
        },
        enum: {
          $ref: "#/definitions/enum"
        },
        multipleOf: {
          $ref: "#/definitions/multipleOf"
        }
      }
    },
    queryParameterSubSchema: {
      additionalProperties: false,
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      },
      properties: {
        required: {
          type: "boolean",
          description:
            "Determines whether or not this parameter is required or optional.",
          default: false
        },
        in: {
          type: "string",
          description: "Determines the location of the parameter.",
          enum: ["query"]
        },
        description: {
          type: "string",
          description:
            "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
        },
        name: {
          type: "string",
          description: "The name of the parameter."
        },
        allowEmptyValue: {
          type: "boolean",
          default: false,
          description:
            "allows sending a parameter by name only or with an empty value."
        },
        type: {
          type: "string",
          enum: ["string", "number", "boolean", "integer", "array"]
        },
        format: {
          type: "string"
        },
        items: {
          $ref: "#/definitions/primitivesItems"
        },
        collectionFormat: {
          $ref: "#/definitions/collectionFormatWithMulti"
        },
        default: {
          $ref: "#/definitions/default"
        },
        maximum: {
          $ref: "#/definitions/maximum"
        },
        exclusiveMaximum: {
          $ref: "#/definitions/exclusiveMaximum"
        },
        minimum: {
          $ref: "#/definitions/minimum"
        },
        exclusiveMinimum: {
          $ref: "#/definitions/exclusiveMinimum"
        },
        maxLength: {
          $ref: "#/definitions/maxLength"
        },
        minLength: {
          $ref: "#/definitions/minLength"
        },
        pattern: {
          $ref: "#/definitions/pattern"
        },
        maxItems: {
          $ref: "#/definitions/maxItems"
        },
        minItems: {
          $ref: "#/definitions/minItems"
        },
        uniqueItems: {
          $ref: "#/definitions/uniqueItems"
        },
        enum: {
          $ref: "#/definitions/enum"
        },
        multipleOf: {
          $ref: "#/definitions/multipleOf"
        }
      }
    },
    formDataParameterSubSchema: {
      additionalProperties: false,
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      },
      properties: {
        required: {
          type: "boolean",
          description:
            "Determines whether or not this parameter is required or optional.",
          default: false
        },
        in: {
          type: "string",
          description: "Determines the location of the parameter.",
          enum: ["formData"]
        },
        description: {
          type: "string",
          description:
            "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
        },
        name: {
          type: "string",
          description: "The name of the parameter."
        },
        allowEmptyValue: {
          type: "boolean",
          default: false,
          description:
            "allows sending a parameter by name only or with an empty value."
        },
        type: {
          type: "string",
          enum: ["string", "number", "boolean", "integer", "array", "file"]
        },
        format: {
          type: "string"
        },
        items: {
          $ref: "#/definitions/primitivesItems"
        },
        collectionFormat: {
          $ref: "#/definitions/collectionFormatWithMulti"
        },
        default: {
          $ref: "#/definitions/default"
        },
        maximum: {
          $ref: "#/definitions/maximum"
        },
        exclusiveMaximum: {
          $ref: "#/definitions/exclusiveMaximum"
        },
        minimum: {
          $ref: "#/definitions/minimum"
        },
        exclusiveMinimum: {
          $ref: "#/definitions/exclusiveMinimum"
        },
        maxLength: {
          $ref: "#/definitions/maxLength"
        },
        minLength: {
          $ref: "#/definitions/minLength"
        },
        pattern: {
          $ref: "#/definitions/pattern"
        },
        maxItems: {
          $ref: "#/definitions/maxItems"
        },
        minItems: {
          $ref: "#/definitions/minItems"
        },
        uniqueItems: {
          $ref: "#/definitions/uniqueItems"
        },
        enum: {
          $ref: "#/definitions/enum"
        },
        multipleOf: {
          $ref: "#/definitions/multipleOf"
        }
      }
    },
    pathParameterSubSchema: {
      additionalProperties: false,
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      },
      required: ["required"],
      properties: {
        required: {
          type: "boolean",
          enum: [true],
          description:
            "Determines whether or not this parameter is required or optional."
        },
        in: {
          type: "string",
          description: "Determines the location of the parameter.",
          enum: ["path"]
        },
        description: {
          type: "string",
          description:
            "A brief description of the parameter. This could contain examples of use.  GitHub Flavored Markdown is allowed."
        },
        name: {
          type: "string",
          description: "The name of the parameter."
        },
        type: {
          type: "string",
          enum: ["string", "number", "boolean", "integer", "array"]
        },
        format: {
          type: "string"
        },
        items: {
          $ref: "#/definitions/primitivesItems"
        },
        collectionFormat: {
          $ref: "#/definitions/collectionFormat"
        },
        default: {
          $ref: "#/definitions/default"
        },
        maximum: {
          $ref: "#/definitions/maximum"
        },
        exclusiveMaximum: {
          $ref: "#/definitions/exclusiveMaximum"
        },
        minimum: {
          $ref: "#/definitions/minimum"
        },
        exclusiveMinimum: {
          $ref: "#/definitions/exclusiveMinimum"
        },
        maxLength: {
          $ref: "#/definitions/maxLength"
        },
        minLength: {
          $ref: "#/definitions/minLength"
        },
        pattern: {
          $ref: "#/definitions/pattern"
        },
        maxItems: {
          $ref: "#/definitions/maxItems"
        },
        minItems: {
          $ref: "#/definitions/minItems"
        },
        uniqueItems: {
          $ref: "#/definitions/uniqueItems"
        },
        enum: {
          $ref: "#/definitions/enum"
        },
        multipleOf: {
          $ref: "#/definitions/multipleOf"
        }
      }
    },
    nonBodyParameter: {
      type: "object",
      required: ["name", "in", "type"],
      oneOf: [
        {
          $ref: "#/definitions/headerParameterSubSchema"
        },
        {
          $ref: "#/definitions/formDataParameterSubSchema"
        },
        {
          $ref: "#/definitions/queryParameterSubSchema"
        },
        {
          $ref: "#/definitions/pathParameterSubSchema"
        }
      ]
    },
    parameter: {
      oneOf: [
        {
          $ref: "#/definitions/bodyParameter"
        },
        {
          $ref: "#/definitions/nonBodyParameter"
        }
      ]
    },
    schema: {
      type: "object",
      description: "A deterministic version of a JSON Schema object.",
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      },
      properties: {
        $ref: {
          type: "string"
        },
        format: {
          type: "string"
        },
        title: {
          $ref: "http://json-schema.org/draft-04/schema#/properties/title"
        },
        description: {
          $ref: "http://json-schema.org/draft-04/schema#/properties/description"
        },
        default: {
          $ref: "http://json-schema.org/draft-04/schema#/properties/default"
        },
        multipleOf: {
          $ref: "http://json-schema.org/draft-04/schema#/properties/multipleOf"
        },
        maximum: {
          $ref: "http://json-schema.org/draft-04/schema#/properties/maximum"
        },
        exclusiveMaximum: {
          $ref:
            "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum"
        },
        minimum: {
          $ref: "http://json-schema.org/draft-04/schema#/properties/minimum"
        },
        exclusiveMinimum: {
          $ref:
            "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum"
        },
        maxLength: {
          $ref:
            "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
        },
        minLength: {
          $ref:
            "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
        },
        pattern: {
          $ref: "http://json-schema.org/draft-04/schema#/properties/pattern"
        },
        maxItems: {
          $ref:
            "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
        },
        minItems: {
          $ref:
            "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
        },
        uniqueItems: {
          $ref: "http://json-schema.org/draft-04/schema#/properties/uniqueItems"
        },
        maxProperties: {
          $ref:
            "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
        },
        minProperties: {
          $ref:
            "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
        },
        required: {
          $ref:
            "http://json-schema.org/draft-04/schema#/definitions/stringArray"
        },
        enum: {
          $ref: "http://json-schema.org/draft-04/schema#/properties/enum"
        },
        additionalProperties: {
          anyOf: [
            {
              $ref: "#/definitions/schema"
            },
            {
              type: "boolean"
            }
          ],
          default: {}
        },
        type: {
          $ref: "http://json-schema.org/draft-04/schema#/properties/type"
        },
        items: {
          anyOf: [
            {
              $ref: "#/definitions/schema"
            },
            {
              type: "array",
              minItems: 1,
              items: {
                $ref: "#/definitions/schema"
              }
            }
          ],
          default: {}
        },
        allOf: {
          type: "array",
          minItems: 1,
          items: {
            $ref: "#/definitions/schema"
          }
        },
        properties: {
          type: "object",
          additionalProperties: {
            $ref: "#/definitions/schema"
          },
          default: {}
        },
        discriminator: {
          type: "string"
        },
        readOnly: {
          type: "boolean",
          default: false
        },
        xml: {
          $ref: "#/definitions/xml"
        },
        externalDocs: {
          $ref: "#/definitions/externalDocs"
        },
        example: {}
      },
      additionalProperties: false
    },
    fileSchema: {
      type: "object",
      description: "A deterministic version of a JSON Schema object.",
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      },
      required: ["type"],
      properties: {
        format: {
          type: "string"
        },
        title: {
          $ref: "http://json-schema.org/draft-04/schema#/properties/title"
        },
        description: {
          $ref: "http://json-schema.org/draft-04/schema#/properties/description"
        },
        default: {
          $ref: "http://json-schema.org/draft-04/schema#/properties/default"
        },
        required: {
          $ref:
            "http://json-schema.org/draft-04/schema#/definitions/stringArray"
        },
        type: {
          type: "string",
          enum: ["file"]
        },
        readOnly: {
          type: "boolean",
          default: false
        },
        externalDocs: {
          $ref: "#/definitions/externalDocs"
        },
        example: {}
      },
      additionalProperties: false
    },
    primitivesItems: {
      type: "object",
      additionalProperties: false,
      properties: {
        type: {
          type: "string",
          enum: ["string", "number", "integer", "boolean", "array"]
        },
        format: {
          type: "string"
        },
        items: {
          $ref: "#/definitions/primitivesItems"
        },
        collectionFormat: {
          $ref: "#/definitions/collectionFormat"
        },
        default: {
          $ref: "#/definitions/default"
        },
        maximum: {
          $ref: "#/definitions/maximum"
        },
        exclusiveMaximum: {
          $ref: "#/definitions/exclusiveMaximum"
        },
        minimum: {
          $ref: "#/definitions/minimum"
        },
        exclusiveMinimum: {
          $ref: "#/definitions/exclusiveMinimum"
        },
        maxLength: {
          $ref: "#/definitions/maxLength"
        },
        minLength: {
          $ref: "#/definitions/minLength"
        },
        pattern: {
          $ref: "#/definitions/pattern"
        },
        maxItems: {
          $ref: "#/definitions/maxItems"
        },
        minItems: {
          $ref: "#/definitions/minItems"
        },
        uniqueItems: {
          $ref: "#/definitions/uniqueItems"
        },
        enum: {
          $ref: "#/definitions/enum"
        },
        multipleOf: {
          $ref: "#/definitions/multipleOf"
        }
      },
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    security: {
      type: "array",
      items: {
        $ref: "#/definitions/securityRequirement"
      },
      uniqueItems: true
    },
    securityRequirement: {
      type: "object",
      additionalProperties: {
        type: "array",
        items: {
          type: "string"
        },
        uniqueItems: true
      }
    },
    xml: {
      type: "object",
      additionalProperties: false,
      properties: {
        name: {
          type: "string"
        },
        namespace: {
          type: "string"
        },
        prefix: {
          type: "string"
        },
        attribute: {
          type: "boolean",
          default: false
        },
        wrapped: {
          type: "boolean",
          default: false
        }
      },
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    tag: {
      type: "object",
      additionalProperties: false,
      required: ["name"],
      properties: {
        name: {
          type: "string"
        },
        description: {
          type: "string"
        },
        externalDocs: {
          $ref: "#/definitions/externalDocs"
        }
      },
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    securityDefinitions: {
      type: "object",
      additionalProperties: {
        oneOf: [
          {
            $ref: "#/definitions/basicAuthenticationSecurity"
          },
          {
            $ref: "#/definitions/apiKeySecurity"
          },
          {
            $ref: "#/definitions/oauth2ImplicitSecurity"
          },
          {
            $ref: "#/definitions/oauth2PasswordSecurity"
          },
          {
            $ref: "#/definitions/oauth2ApplicationSecurity"
          },
          {
            $ref: "#/definitions/oauth2AccessCodeSecurity"
          }
        ]
      }
    },
    basicAuthenticationSecurity: {
      type: "object",
      additionalProperties: false,
      required: ["type"],
      properties: {
        type: {
          type: "string",
          enum: ["basic"]
        },
        description: {
          type: "string"
        }
      },
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    apiKeySecurity: {
      type: "object",
      additionalProperties: false,
      required: ["type", "name", "in"],
      properties: {
        type: {
          type: "string",
          enum: ["apiKey"]
        },
        name: {
          type: "string"
        },
        in: {
          type: "string",
          enum: ["header", "query"]
        },
        description: {
          type: "string"
        }
      },
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    oauth2ImplicitSecurity: {
      type: "object",
      additionalProperties: false,
      required: ["type", "flow", "authorizationUrl"],
      properties: {
        type: {
          type: "string",
          enum: ["oauth2"]
        },
        flow: {
          type: "string",
          enum: ["implicit"]
        },
        scopes: {
          $ref: "#/definitions/oauth2Scopes"
        },
        authorizationUrl: {
          type: "string",
          format: "uri"
        },
        description: {
          type: "string"
        }
      },
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    oauth2PasswordSecurity: {
      type: "object",
      additionalProperties: false,
      required: ["type", "flow", "tokenUrl"],
      properties: {
        type: {
          type: "string",
          enum: ["oauth2"]
        },
        flow: {
          type: "string",
          enum: ["password"]
        },
        scopes: {
          $ref: "#/definitions/oauth2Scopes"
        },
        tokenUrl: {
          type: "string",
          format: "uri"
        },
        description: {
          type: "string"
        }
      },
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    oauth2ApplicationSecurity: {
      type: "object",
      additionalProperties: false,
      required: ["type", "flow", "tokenUrl"],
      properties: {
        type: {
          type: "string",
          enum: ["oauth2"]
        },
        flow: {
          type: "string",
          enum: ["application"]
        },
        scopes: {
          $ref: "#/definitions/oauth2Scopes"
        },
        tokenUrl: {
          type: "string",
          format: "uri"
        },
        description: {
          type: "string"
        }
      },
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    oauth2AccessCodeSecurity: {
      type: "object",
      additionalProperties: false,
      required: ["type", "flow", "authorizationUrl", "tokenUrl"],
      properties: {
        type: {
          type: "string",
          enum: ["oauth2"]
        },
        flow: {
          type: "string",
          enum: ["accessCode"]
        },
        scopes: {
          $ref: "#/definitions/oauth2Scopes"
        },
        authorizationUrl: {
          type: "string",
          format: "uri"
        },
        tokenUrl: {
          type: "string",
          format: "uri"
        },
        description: {
          type: "string"
        }
      },
      patternProperties: {
        "^x-": {
          $ref: "#/definitions/vendorExtension"
        }
      }
    },
    oauth2Scopes: {
      type: "object",
      additionalProperties: {
        type: "string"
      }
    },
    mediaTypeList: {
      type: "array",
      items: {
        $ref: "#/definitions/mimeType"
      },
      uniqueItems: true
    },
    parametersList: {
      type: "array",
      description: "The parameters needed to send a valid API call.",
      additionalItems: false,
      items: {
        oneOf: [
          {
            $ref: "#/definitions/parameter"
          },
          {
            $ref: "#/definitions/jsonReference"
          }
        ]
      },
      uniqueItems: true
    },
    schemesList: {
      type: "array",
      description: "The transfer protocol of the API.",
      items: {
        type: "string",
        enum: ["http", "https", "ws", "wss"]
      },
      uniqueItems: true
    },
    collectionFormat: {
      type: "string",
      enum: ["csv", "ssv", "tsv", "pipes"],
      default: "csv"
    },
    collectionFormatWithMulti: {
      type: "string",
      enum: ["csv", "ssv", "tsv", "pipes", "multi"],
      default: "csv"
    },
    title: {
      $ref: "http://json-schema.org/draft-04/schema#/properties/title"
    },
    description: {
      $ref: "http://json-schema.org/draft-04/schema#/properties/description"
    },
    default: {
      $ref: "http://json-schema.org/draft-04/schema#/properties/default"
    },
    multipleOf: {
      $ref: "http://json-schema.org/draft-04/schema#/properties/multipleOf"
    },
    maximum: {
      $ref: "http://json-schema.org/draft-04/schema#/properties/maximum"
    },
    exclusiveMaximum: {
      $ref:
        "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum"
    },
    minimum: {
      $ref: "http://json-schema.org/draft-04/schema#/properties/minimum"
    },
    exclusiveMinimum: {
      $ref:
        "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum"
    },
    maxLength: {
      $ref:
        "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
    },
    minLength: {
      $ref:
        "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
    },
    pattern: {
      $ref: "http://json-schema.org/draft-04/schema#/properties/pattern"
    },
    maxItems: {
      $ref:
        "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
    },
    minItems: {
      $ref:
        "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
    },
    uniqueItems: {
      $ref: "http://json-schema.org/draft-04/schema#/properties/uniqueItems"
    },
    enum: {
      $ref: "http://json-schema.org/draft-04/schema#/properties/enum"
    },
    jsonReference: {
      type: "object",
      required: ["$ref"],
      additionalProperties: false,
      properties: {
        $ref: {
          type: "string"
        }
      }
    }
  }
}
